<?php 

class TablaRegresion
{
    public $nombre_tabla = "";//string
    public $acumulado_pesos = 0.0;//string
    public $acumumulado_individuos = 0.0;//float
    public $pesos =  Array();//list float
    public $cant_individuos = Array();//list int 
  
    function getPromedioPesos() 
    {
        return ($this->acumulado_pesos / sizeof($this->pesos));
    }

    function getPromedioIndividuos() 
    {
        return ($this->acumumulado_individuos / sizeof($this->cant_individuos));
    }

    function setNombre_tabla($nom_tabla) 
    {
        $this->nombre_tabla = $nom_tabla;
    }

    function setPesos($pesos_) 
    {
        $this->pesos = $pesos_;
    }

    function setCant_individuos($cant_individuos_) 
    {
        $this->cant_individuos = $cant_individuos_;
    }

    function addPeso($peso_) 
    {
        $this->acumulado_pesos += $peso_;
        array_push($this->pesos, $peso_);
    }

    function addCantIndividuos($cantIndividuos_) 
    {
        $this->acumumulado_individuos += $cantIndividuos_;
        array_push($this->cant_individuos, $cantIndividuos_);
    }

    function varianza() 
    {
        $varianza = 0.0;
        $promInd = $this->getPromedioIndividuos();
        for ($i = 0; $i < sizeof($this->cant_individuos); $i++) 
        {
            $varianza += $this->cant_individuos[$i] - $promInd; 
        }
        if ($varianza != 0) 
        {
            die("Error calculating var(x)");
        }
        $a = $varianza / sizeof($this->cant_individuos);
        return $varianza == 0 ? 0 : $a;
    }

    function variableA()
    {
        $variable = 0.0;
        $promInd = $this->getPromedioIndividuos();
        $promPes = $this->getPromedioPesos();
        for ($i = 0; $i < sizeof($this->cant_individuos); $i++) 
        {
            $variable += ($this->cant_individuos[$i] - $promInd) * ($this->pesos[$i] - $promPes);
        }
        $deno = sizeof($this->cant_individuos) * $this->varianza();
        return $deno == 0 ? 0 : $variable / $deno;
    }

    function variableB() 
    {
        return ($this->getPromedioPesos() - ($this->variableA() * $this->getPromedioIndividuos()));
    }

    function funcion() 
    {
        return ($this->variableA() * $this->getPromedioIndividuos() + $this->variableB());
    } 
} 
//////////////////////////////////////////////////////CHANGE///////////////////////////////////////////////////
class TableSpaceRegresion 
{

    public $nombre = "";
    public $list = Array();//TablaRegresion
    public $prom_individuos = 0.0;
    public $prom_pesos = 0.0;
    public $espacioLibre = 0.0;
    public $libreMb = 0.0;
    public $usadoMb = 0.0;


    function setLibreMb($libreMb) 
    {
        $this->libreMb = $libreMb;
    }

    function setUsadoMb($usadoMb) 
    {
        $this->usadoMb = $usadoMb;
    }
    
    function setNombre($nombre) 
    {
        $this->nombre = $nombre;
    }

    
    function setList($list) 
    {
        $this->list = $list;
    }

    function setProm_individuos($prom_individuos) 
    {
        $this->prom_individuos = $prom_individuos;
    }

    function getPromedioPesos() 
    {
        $prom = 0.0;
        for ($i = 0; $i < sizeof($this->list);$i++) 
        {
            $prom += $this->list[$i]->acumulado_pesos;
        }
        return $prom;
    }

    function promedioCrecimiento() 
    {
        $pron = 0.0;
        for ($i = 0; $i < sizeof($this->list);$i++)
        {            
            $pron += $this->list[$i]->funcion();
        } 
        $s = sizeof($this->list);
        return ($s != 0)?($pron / $s):0;
    }

    function pronostico() 
    { 
        $pron = $this->promedioCrecimiento();
        return ($pron != 0)?($this->libreMb / $pron):0;
    }


    function setEspacioLibre($espacioLibre) 
    {
        $this->espacioLibre = $espacioLibre;
    }

    function setProm_pesos($prom_pesos) 
    {
        $this->prom_pesos = $prom_pesos;
    }

    function agrega_nombre_tabla($n)
    {  
        $tr = new TablaRegresion(); 
        $tr->setNombre_tabla($n);
        array_push($this->list, $tr);
    } 
    
    function getTablaRegresion($nomTabla) 
    {
        for ($i = 0; $i < sizeof($this->list);$i++)
        {
            if (strcmp($this->list[$i]->nombre_tabla ,$nomTabla)==0)
                return $this->list[$i];  
        }
        return NULL;
    } 

    function addPeso($tabla, $peso) 
    {
        $this->prom_pesos += $peso; 
        $this->getTablaRegresion($tabla)->addPeso($peso);
        //getTablaRegresion(tabla).addPeso(peso);
    } 

    function addIndividuos($tabla, $cantIndividuos) 
    {
        $this->prom_individuos += $cantIndividuos;
        $this->getTablaRegresion($tabla)->addCantIndividuos($cantIndividuos);
    } 
    
    function prcFinal()
    { 
        $prc = ($this->libreMb + $this->usadoMb);
        return ($prc != 0)? ($this->usadoMb / $prc * 100):0;
    }
}
//////////////////////////////////////////////CHANGE///////////////////////////////////////////////////////////////////////
class RegresionLineal 
{

    public $list = Array(); // TableSpaceRegresion  
    
    function tablespaceExiste($nombre) 
    {
        for ($i = 0; $i < sizeof($this->list); $i++) 
        {
            if ($this->list[$i]->nombre == $nombre) 
                return false;
        }
        return true;
    }   
    
    function getTableSpaceRegresion($nombre) 
    {
        for ($i = 0; $i < sizeof($this->list); $i++) 
        {
            if (strcmp($this->list[$i]->nombre ,$nombre)==0) 
                return $this->list[$i];
            
        }
        return NULL;
    }
 
    function agrega($nom_tableSpace, $table, $y, $x) 
    {  
        $tbspc = $this->getTableSpaceRegresion($nom_tableSpace);
        if ($tbspc == NULL) 
        { 
            //list.add(new TableSpaceRegresion(nom_tableSpace)); 
            $tbspc = new TableSpaceRegresion();
            $tbspc->setNombre($nom_tableSpace); 
            array_push($this->list, $tbspc); 
        }
        if ($tbspc->getTablaRegresion($table) == NULL) 
            $tbspc->agrega_nombre_tabla($table);
        $tbspc->addPeso($table, $x);
        $tbspc->addIndividuos($table, $y);
    }


    function setEspacios($nom_tablespace, $libre, $usado) 
    { 
        $tbspc = $this->getTableSpaceRegresion($nom_tablespace);
        if ($tbspc != NULL) 
        {
            $tbspc->setLibreMb($libre);
            $tbspc->setUsadoMb($usado);            
        }
        else
        {
            $tbspc = new TableSpaceRegresion();
            $tbspc->setNombre($nom_tablespace); 
            array_push($this->list, $tbspc); 
        }
    }

    
    function getPronostico($nombre) 
    {
        $tbspc = $this->getTableSpaceRegresion($nombre); 
        if($tbspc != NULL)
            return $tbspc->pronostico();
        return -1;
    }
  
    function getPorcUsado($tablespace) 
    {
        for ($i = 0; $i < sizeof($this->list); $i++)
        {
            if($this->list[$i]->nombre == $tablespace)
                return $this->list[$i]->prcFinal();
        }
        return -1;
    }
    
    function getNombreTablespaces() 
    {
        $tables = Array();
        for ($i = 0; $i < sizeof($this->list); $i++)
            array_push($tables,$this->list[$i]->nombre);
        return $tables;
    }
} 

function formatoPronostico($pron) 
{
    $t = (float)($pron); 
    if(is_float($t)) 
    { 
        $tipo = "";
        if ($t > 365) 
        {
            $t /= 365;
            $tipo = " Años ";
        } 
        else 
        {
            if ($t > 30) 
            {
                $t /= 30;
                $tipo = " Meses ";
            } 
            else 
                $tipo = " Días ";
        }
        $roundOff = round($t * 100.0) / 100.0; 
        return  $roundOff." ".$tipo;
    }
    else 
        return $pron." Días";
}